package org.posupe.cursos;

import java.io.Serializable;

import org.posupe.instituicoesEnsino.InstituicaoEnsino;

public class Curso implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int codigo;
	private String nome;
	private String descricao;
	
	private String nivel;
	private InstituicaoEnsino instituicaoEnsino;
	private int cargaHoraria;
	
	private static String NIVEL_TECNICO = "TECNICO";
	private static String NIVEL_GRADUACAO = "GRADUACAO";
	private static String NIVEL_ESPECIALIZACAO = "ESPECIALIZACAO";
	private static String NIVEL_MESTRADO = "MESTRADO";
	private static String NIVEL_DOUTORADO = "DOUTORADO";
	
	public Curso(int codigo, String nome, String descricao,
			String nivel, InstituicaoEnsino instituicaoEnsino, int cargaHoraria){
		this.codigo = codigo;
		this.nome = nome;
		this.descricao = descricao;
		this.nivel = nivel;
		this.instituicaoEnsino = instituicaoEnsino;
		this.cargaHoraria = cargaHoraria;
	}
	public Curso(int codigo, String nome, String descricao){
		this.codigo = codigo;
		this.nome = nome;
		this.descricao = descricao;
	}
	public int getCargaHoraria() {
		return cargaHoraria;
	}
	
	public void setCargaHoraria(int cargaHoraria) {
		this.cargaHoraria = cargaHoraria;
	}
	
	public int getCodigo() {
		return codigo;
	}
	
	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	
	public String getDescricao() {
		return descricao;
	}
	
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	

	public InstituicaoEnsino getInstituicaoEnsino() {
		return instituicaoEnsino;
	}
	
	public void setInstituicaoEnsino(InstituicaoEnsino instituicaoEnsino) {
		this.instituicaoEnsino = instituicaoEnsino;
	}
	
	public String getNivel() {
		return nivel;
	}
	
	public void setNivel(String nivel) {
		this.nivel = nivel;
	}
	
	public String getNome() {
		return nome;
	}
	
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public boolean equals(Curso curso){
		return (curso instanceof Curso )&&(this.getCodigo() == curso.getCodigo());
	}
	
	public boolean match(Curso curso){
		boolean retorno = true;
		
		if(retorno && (curso.nome == null) 
			&& (curso.nome == null)
			&& (curso.descricao== null)
			&& (curso.nivel == null)
			&& (curso.instituicaoEnsino== null)
			){
				retorno = false;
			
		}
		
		if((retorno &&
				this.nome == null) 
				&& (this.nome == null)
				&& (this.descricao== null)
				&& (this.nivel == null)
				&& (this.instituicaoEnsino== null)){
					retorno = false;
				}
		if (curso == null) {
			retorno = false;
		}
		if( retorno && curso.nome != null){
			if (this.nome!=null){
				if(!this.nome.contains(curso.nome)){
					retorno = false;
				}
			} else {
				retorno = false;
			}
		} 
		
		if( retorno && curso.descricao != null){
			if (this.descricao!=null){
				if(!this.descricao.contains(curso.descricao)){
					retorno = false;
				}
			} else {
				retorno = false;
			}
			
		}
		
		if( retorno &&curso.nivel != null){
			if (this.nivel!=null) {
				if(!this.nivel.contains(curso.nivel)){
					retorno = false;
				}
			} else {
				retorno = false;
			}
		}
					
		if( retorno && curso.instituicaoEnsino!= null){
			if (this.instituicaoEnsino!=null){
				if(!this.instituicaoEnsino.match(curso.instituicaoEnsino)){
					retorno = false;
				}
			} else {
				retorno = false;
			}

		}
		
		return retorno;
	}
	public String toString(){
		return this.codigo + " : " + this.nome + " - " + this.descricao + " - Inst: " + this.getInstituicaoEnsino().getSigla();
	}
	public static String getNIVEL_DOUTORADO() {
		return NIVEL_DOUTORADO;
	}
	public static String getNIVEL_ESPECIALIZACAO() {
		return NIVEL_ESPECIALIZACAO;
	}
	public static String getNIVEL_GRADUACAO() {
		return NIVEL_GRADUACAO;
	}
	public static String getNIVEL_MESTRADO() {
		return NIVEL_MESTRADO;
	}
	public static String getNIVEL_TECNICO() {
		return NIVEL_TECNICO;
	}
	
	public boolean equals(Object o) {
		boolean resultado = false;
		if (o instanceof Curso) {
			Curso aux = (Curso) o;
			if (aux.codigo == this.codigo) {
				resultado = true;
			}
		}
		return resultado;
	}
}